# -*- coding: utf-8 -*-

"""
Pandas 库使用示例

Pandas 是一个功能强大的数据分析和处理库，核心数据结构是 Series 和 DataFrame。
"""

import pandas as pd
import numpy as np

# 1. 创建 Series 和 DataFrame
print("======== 1. 创建 Series 和 DataFrame ========")
# Series 是一维带标签的数组
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(f"Series:\n{s}")

# DataFrame 是二维带标签的数据结构，可以看作是 Series 的容器
dates = pd.date_range("20230101", periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list("ABCD"))
print(f"\nDataFrame:\n{df}")

# 2. 查看数据
print("\n======== 2. 查看数据 ========")
print(f"DataFrame 的前两行:\n{df.head(2)}")
print(f"\nDataFrame 的后两行:\n{df.tail(2)}")
print(f"\nDataFrame 的索引:\n{df.index}")
print(f"\nDataFrame 的列:\n{df.columns}")
print(f"\nDataFrame 的统计摘要:\n{df.describe()}")

# 3. 数据选择和切片
print("\n======== 3. 数据选择和切片 ========")
# 选择单列
print(f"选择 A 列:\n{df['A']}")

# 通过行切片
print(f"\n行切片 [0:3]:\n{df[0:3]}")

# 通过标签选择
print(f"\n通过标签选择一行:\n{df.loc[dates[0]]}")

# 通过位置选择
print(f"\n通过位置选择一行:\n{df.iloc[3]}")

# 4. 数据处理
print("\n======== 4. 数据处理 ========")
# 处理缺失值
df_cleaned = df.dropna(how="any")
print(f"删除含 NaN 的行后:\n{df_cleaned}")

# 填充缺失值
df_filled = df.fillna(value=5)
print(f"\n填充 NaN 为 5 后:\n{df_filled}")

# 5. 分组和聚合
print("\n======== 5. 分组和聚合 ========")
df_group = pd.DataFrame({
    "A": ["foo", "bar", "foo", "bar", "foo", "bar"],
    "B": np.random.randn(6)
})
print(f"分组前的 DataFrame:\n{df_group}")
print(f"\n按 A 列分组并求和:\n{df_group.groupby('A').sum()}")

def run_all_tests():
    print("\n======== Pandas 测试 ========")
    # 测试 Series 创建
    s = pd.Series([1, 2, 3])
    assert len(s) == 3
    # 测试 DataFrame 创建
    df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
    assert df.shape == (2, 2)
    # 测试分组
    df_group = pd.DataFrame({"A": ["a", "a", "b"], "B": [1, 2, 3]})
    grouped = df_group.groupby("A").sum()
    assert grouped.loc["a"]["B"] == 3
    print("所有 Pandas 测试通过!")

if __name__ == "__main__":
    run_all_tests()